% coding: utf-8

\section{Enunciado del trabajo práctico}
\parindent = 0 pt
\parskip = 11 pt

\begin{enumerate}
\item{\textbf{Introducción}}
\\
\indent En este taller vamos a abordar en forma práctica algunos de los conceptos de nivel de enlace aprendidos en la materia. Esencialmente, analizaremos de manera interactiva el protocolo Ethernet, utilizando para ello dos herramientas de manipulación y análisis de paquetes: Wireshark \footnote{Wireshark (página web oficial) http://www.wireshark.org} y Scapy \footnote{Scapy (página web oficial) http://www.sedev.org/projects/scapy/}. 
\\
\indent A los efectos de lograr tales objetivos, trabajaremos con un protocolo cliente/servidor sencillo definido por la cátedra. Cada grupo tendrá la tarea de establecer una comunicación con el servidor siguiendo los lineamientos establecidos en las secciones posteriores. Por último, se deberá elaborar y entregar un informe corto donde se resuman las actividades realizadas y se contesten las preguntas detalladas más abajo.


\item{\textbf{Enunciado}}
\subitem {\textbf{El protocolo}}
\\
\indent El protocolo de este taller permite que las distintas máquinas cliente de los estudiantes se anuncien a un servidor central de la cátedra y puedan luego realizarle algunas preguntas predefinidas sobre el próximo parcial de la materia. Al ser la identidad del servidor desconocida, se espera que en una primera instancia cada grupo envíe un mensaje broadcast de anunciación. Una vez recibido por el servidor, éste responderá en forma unicast saludando cordialmente al nuevo grupo y comunicando también su dirección física. A partir de este punto, los grupos estarán en condiciones de consultar (vía unicast) al servidor.
\\
\indent La figura ilustra el formato de nuestros paquetes. Tener en cuenta que éstos viajarán directamente como payload de las tramas Ethernet. A propósito de esto, se deberá fijar el campo type de dichas tramas en 0xFFFF para indicar que transportan mensajes de este protocolo.
\begin{center}

\paqueteEthernet{Tipo}{ID Grupo}{Payload}{Checksum}


Figura 1: Formato del paquete de nuestro protocolo
\end{center}

\indent Por simplicidad, vamos a asumir a lo largo de taller que estos paquetes consisten en texto ASCII plano separando cada campo a través del símbolo |. De esta manera, la secuencia de caracteres \paqueteEthernet{1}{OSI Knights}{0}{97} representa un paquete válido. A continuación mostramos cómo se define la semántica de cada campo:

\begin{itemize}

\item Tipo: anunciación (1) o pregunta/respuesta (2).

\item ID Grupo: secuencia de caracteres ASCII que identifica (unívocamente) al grupo solicitante.
Este campo no tiene trascendencia para los mensajes enviados por el servidor.

\item Payload: debe ser siempre 0 para mensajes de tipo 1 (i.e., anunciación). Cuando el tipo es 2 (i.e., pregunta/respuesta),
\subitem Para el cliente, 1, 2 ó 3, dependiendo de la pregunta (ver más abajo).
\subitem Para el servidor, el texto conteniendo la respuesta.

\item Checksum: suma (en decimal) de los valores ASCII de cada caracter en los campos Tipo y Payload.
\end{itemize}


\indent Las preguntas predefinidas al servicio de los estudiantes son las siguientes: 
\begin{itemize}


\item ¿Cuándo es el próximo parcial?
\item ¿Qué temas entran en el próximo parcial?
\item ¿Vamos a aprobar el próximo parcial?

\end{itemize}


\subitem \textbf{Consignas}

\subsubitem \textbf{Primera parte: anunciación}
\\
\indent La primera parte de la actividad consiste en anunciarse al servidor. Esto puede conseguirse construyendo con Scapy un paquete Ethernet conteniendo la información apropiada y luego inyectarlo en la red. Para recibir la información del servidor, una alternativa es levantar con Wireshark los paquetes entrantes.
\\
\indent Como guía para esta consigna y para la elaboración del informe, se recomienda poner especial atención a las siguientes preguntas:

\begin{itemize}

\item ¿Cómo se implementa broadcast por Ethernet?
\item ¿Cual es el payload efectivo que se coloca en el medio? ¿Cuanto mide? ¿Se envió lo que generamos? Analizar esta pregunta observando en Wireshark los paquetes salientes.
\item ¿Qué ocurre con el valor del checksum para este tipo de mensajes?
\item A la hora de identificar a cada grupo para enviarle respuestas, el servidor puede hacer uso del identificador provisto (manteniendo, por ejemplo, un mapeo de tales identificadores a direcciones físicas) o bien de la dirección MAC que figura en la trama Ethernet enviada por el cliente.
Pensar cómo se podría hacer ingeniería reversa de la implementación del servidor en cuanto a la identificación de los grupos. En otras palabras, analizar qué mensajes podrían enviarse para que, dadas las respuestas, se pueda inferir de ellas cómo el servidor hace uso del identificador del grupo y de la dirección MAC de la máquina de dicho grupo.

\end{itemize}

\subitem \textbf{Segunda parte: preguntas y checksum}
\\
\indent En la segunda y última etapa nuestro objetivo será implementar una función en Scapy para calcular el checksum de cada paquete a enviar. Una vez hecho esto, podremos interactuar más fácilmente con el servidor a la hora de enviarle nuestras consultas. Observar que un algoritmo trivial para computar este valor es el siguiente:
\begin{itemize}


\item Concatenar los campos Tipo y Payload.
\item Recorrer luego cada caracter allí presente e ir sumando el valor ASCII respectivo a una variable inicialmente definida en cero.
\item Retornar dicha variable una vez finalizado el recorrido.
\end{itemize}


\indent A partir de lo anterior, cada grupo deberá consultar al servidor para informarse sobre los pormenores del inminente examen. Tener en cuenta las siguientes preguntas para el desarrollo de la consigna y para la eventual confección del informe:
\begin{itemize}
\item ¿Qué sucede si enviamos un mensaje con un checksum erróneo?
\item ¿Qué poder de detección de errores, medido en caracteres, piensan que tiene este algoritmo de checksum?
\item ¿Consideran que el checksum de este protocolo es suficientemente bueno? ¿Por qué sí o por qué no?
\item ¿Aprobarán o no aprobarán el examen? :)
\end{itemize}



\end{enumerate}

